架設 MAIL


一直以來﹐電子郵件系統就是網路管理中一個大題目﹐其複雜性不亞於管理一個現行網路﹐甚至有些公司還專門有人負責郵件系統的管理工作呢。

認識郵件系統

在我們真正動手設定 Linux 的email 系統之前﹐最好先了解一些關於 email 系統的術語和功能。

先讓我們認識兩個詞﹕MUAMTA ﹐它們分別是 Mail User Agent 和 Mail Transfer Agnet 的意思。MUA 從字面上看似乎好容易給它嚇死﹐但說穿了您可能會笑耶﹕我們平時用的 Outlook Express、Netscape Mail、或是 Linux 上面的 pine ﹐它們都是 MUA 。簡單說﹐MUA 是用來給使用者流覽郵件和書寫郵件的程式。

MTA 呢﹖我們管它叫郵件伺服器好了﹐它負責 MUA 的請求﹐也負責將郵件從一個 MTA 傳到另一個 MTA 。通常一個 MTA 都可以支持好幾種郵件協定﹐例如﹕ UUCP、SMTP、POP 等。 UUCP (Unix to Unix Communication Protocol) 現在已經比較少用了﹐取而代之的是 SMTP (Simple Mail Transfer Protocol) 和 POP (Post Office Protocol) 這兩個協定。 SMTP 負責的將郵件從 MUA 上傳給 MTA﹐也是 MTA 和 MTA 之間的郵件傳遞協定﹔ 而在沒有 POP 之前﹐email 的使用者一般都要用 telnet 或其它遠端控制程式連上 MTA 那裡﹐然後在那裡閱讀郵件﹐而有了 POP 之後﹐ MTA 可以將使用者的郵件存在一個檔案裡﹐然後使用者通過 MUA 連到 MTA ﹐再將信件下載回本地機器閱讀。另外﹐ MUA 和 MTA 都無需是同一個廠家的軟體﹐只要雙方都支持 POP 協定就可以了﹐其靈活性是不言而喻的了。有些程式﹐如 sendmail ﹐表面來說﹐就同時具備 MUA 和 MTA 功能了。

我們用 MUA 撰寫郵件之後﹐是通過 SMTP 協定上傳給 MTA 的﹔而閱讀郵件則是通過 POP 從 MTA 那裡下載回來。所以﹐當您設定 MUA 的時候﹐就要分別指定 SMTP 和 POP 伺服器的位址了﹐雖然﹐大多數情況之下都可能會是同一台機器。如果您看一看 Linux 的 /etc/services 這個檔案﹐您會發現如下這幾行﹕
smtp            25/tcp          mail                                           

pop-2           109/tcp         postoffice      # POP version 2

pop-2           109/udp

pop-3           110/tcp                         # POP version 3

pop-3           110/udp                                                        

它們分別指定了郵件伺服器和外面聯係所使用的 Port 。您會看到 POP 也有兩個版本﹕2 和 3 ﹐分別使用 109 和 110 這兩個 port。

或許您已經留意到 IMAP (Internet Message Access Protocol) 這個協定吧﹕
imap2           143/tcp         imap            # Interim Mail Access Proto v2

imap2           143/udp         imap                                          

這個 IMAP 是目前新的郵件協定﹐通過 IMAP﹐ 使用者在 MUA 那端就無需分別指定 SMTP 和 POP 作為上傳和下載協定了﹐而只一個 IMAP 協定就可以﹐而且 IMAP 還可以讓不同的使用者共用一個 MUA﹐非常方便哦。

現在我們對郵件系統應該有了初步的概念了吧。讓我們簡單的看一看一封郵件的傳遞流程﹕

  1. 使用者 A 使用 MUA 撰寫了一封郵件給另一個網路的使用者 B。
  2. 通過 SMTP 上傳給 MTA。
  3. 然後 MTA 通過 SMTP 再傳給對方網路的 MTA。
  4. 最後使用者 B 通過其自己的 MUA 用 POP 連上 MTA 將郵件下載回來閱讀。
為了加深我們對流程的理解﹐不如讓我們用 telnet 連接一下 Linux 機器﹐來一番完全的手工操作﹕

先建立連接﹕
telnet redhat52 25

您會看到這樣的回應﹕

Trying 192.168.0.17...

Connected to redhat52.siyongc.domain.

Escape character is '^]'.

220 redhat52.siyongc.domain ESMTP Sendmail 8.9.3/8.9.3; Sun, 5 Dec 1999 21:59:57 +1100

然後我們得先介紹一下自己的所在地﹕
HELO redhat52.siyongc.domain
250 redhat52.siyongc.domain Hello IDENT:root@redhat52.siyongc.domain

 [192.168.0.17], pleased to meet you

正如您看到的回應﹐MTA 會非常友善的跟您打個招呼。
如果您要寄信的話﹐先把自己的地址寫在信封上(這是按照西方的信封書寫習慣啦)﹕
MAIL FROM: root@redhate52.siyongc.domain
250 root@redhate52.siyongc.domain... Sender ok

如果您的地址沒問題﹐然後輸入收信人地址﹕
RCPT TO: kenny@siyongc.domain
250 kenny@siyongc.domain... Recipient ok

如果收件人的地址沒問題的話(嘿﹗他們的效率還真快哦﹐不像我們的郵差﹐要等差不多一個星期才知道收信人地址不對)﹐接著您就可以輸入﹕
DATA
354 Enter mail, end with "." on a line by itself

以下就是寫信的內容了﹕
TO: kenny@siyongc.domain
Subject: Test Only

Hello Kenny,
This is a test only.
.

250 WAA02035 Message accepted for delivery 在開頭的兩行﹐我們稱之為 Header﹐我們使用 MUA 寫信的時候也是要輸入的。然後接一空白行(這行不能省)﹐再寫信肉。當您要完成信肉的話﹐另起一新行﹐只帶一個“.”符號就可以了。

最後﹐我們結束 SMTP 連線﹕
QUIT

221 redhat52.siyongc.domain closing connection

Connection closed by foreign host.



剛才是手工的寫一封信﹐下面﹐讓我們手工地收一封信﹕

telnet redhat52 110
您會看到這樣的回應﹕

Trying 192.168.0.17...

Connected to redhat52.siyongc.domain.

Escape character is '^]'.

+OK POP3 redhat52.siyongc.domain v7.59 server ready

然後您輸入POP 使用者名稱﹕
USER kenny
+OK User name accepted, password please

再輸入密碼﹕
PASS lw94&TC0
+OK Mailbox open, 1 messages

然後﹐您輸入﹕
LIST
+OK Mailbox scan listing follows

1 334

.

我們這裡可以看到使用者目前有一封郵件待取﹐如果您要看一看郵件內容﹐請輸入﹕
RETR 1
後面的數字表示郵件的排列號碼﹐如果有您有兩封郵件的話﹐可以輸入‘2’來看第二封。然後您就會看到郵件的內容﹕
+OK 334 octets

Return-Path: 

Received: (from root@redhate52.siyongc.domain)

        by redhat52.siyongc.domain (8.9.3/8.9.3) id VAA01951;

        Sun, 5 Dec 1999 21:44:16 +1100

Date: Sun, 5 Dec 1999 21:44:16 +1100

From: root 

Message-Id: <199912051044.VAA01951@redhat52.siyongc.domain>

To: kenny@siyongc.domain

Subject: test only

Status:



Hello kenny,

This is a test only.

.

如果您認為郵件1沒必要再留在 MTA 上面了﹐那麼您可以將之刪除掉﹕
DELE 1
+OK Message deleted

如果您完成了所有事情﹐要離開的話﹐可以輸入﹕
QUIT
+OK Sayonara

Connection closed by foreign host.

嘿﹗真給它氣死啦﹕居然來了句日本話呢﹗

如果您不能用 POP 連上您的 Linux 伺服器﹐可能您還沒開放 pop/imap 的daemon (還記得這個東東用來做什麼的﹖)﹐請修改您的 /etc/inetd.conf ﹐找到下面幾行﹐將之修改過來﹕
# Pop and imap mail services et al

#

pop-2   stream  tcp     nowait  root    /usr/sbin/tcpd ipop2d

pop-3   stream  tcp     nowait  root    /usr/sbin/tcpd  ipop3d

imap    stream  tcp     nowait  root    /usr/sbin/tcpd  imapd

#

然後﹐您還要讓 inetd 重新讀取設定哦﹕
/etc/rc.d/init.d/inet reload

到這裡﹐您就會發現﹕哦~~~原來 MUA 只不過幫我們輸入了那些命令罷了。在這一個過程中﹐關鍵的角色是 MTA 如何判斷郵件的路由﹐和如何將郵件傳給對方的 MTA。如果您還沒忘記我們在設定 DNS 裡面關於 MX 記錄的設定﹐或許應該略為知道 MTA 是如何通過 DNS 系統來找到對方網路的 MTA。但要 MTA 判斷出究竟將郵件傳給哪一個 MTA 卻是非常複雜的事情﹐恐怕已經超出這裡要說的範圍了。

設定sendmail

在 Redhat 6.0 裡面﹐已經自帶了一個 MTA﹐它就是聞名遐邇的 sendmail 系統了。如果說要設定 sendmail ﹐看一看它的設定檔 /etc/sendmail.cf 就像天書一樣﹗ 的確不是件容易的事情﹐如果要想弄懂它﹐有一本 1021 頁的 O'Reilly Sendmail可以看看。

我當然也沒這能力教你設定好一個完全的 sendmail 系統﹐不過﹐如果您只想 sendmail 幫您寄信的話﹐無需設定任何檔案。但條件是您的 DNS 要設好﹐而且對方也能反查得到您的 domain ﹐也就是說﹐最好您的domain 是一個註冊域名。因為當對方的郵件伺服器接到您的郵件請求之後﹐會看看寄信人地址是否可以回郵﹐否則會告訴您諸如“Sender domain must resolve”或“cannot route to sender” 這樣的信息。

換句話說﹐如果您的 DNS 沒有經過註冊﹐人們又怎樣寄信給您呢﹖有一個簡單的辦法是在 MAU 下面設定 repply address 到您的 ISP 或其它合法信箱。要完成一個順利的郵件傳遞﹐最好雙方都可以知道如何回郵﹐使用 DNS 是最普遍的做法。當然﹐您也可以使用 UUCP 或 static mapping 的方法啦﹐但別忘記設定是雙向的。

好了﹐現在假設您已經成功的註冊好 DNS 了﹐寄信應該沒問題了吧﹖但您有否發現﹐從您的 Linux 主機幾出去的郵件﹐其回郵地址格式是這樣的﹕user@host.your.domain.name 呢﹖如果您按 Repply 回復到這個地址﹐應該沒問題的﹐但您有試過使用 user@your.domain.name 這樣的格式麼﹖試試就知道了﹕如果您沒做任何設定﹐這樣的地址是寄不到使用者信箱的。

有辦法解決麼﹖當然有啦﹐而且很簡單呢﹗您只要將 your.domain.name 放進 /etc/sendmail.cw這個檔案就可以了﹐這是用來設定郵件伺服器別名的檔案。如果您有多個別名(或曰 domain )要這台主機接收﹐那麼將它們全部寫進這個檔案﹐一個名稱佔一行。然後﹐您竟然無需重新啟動 sendmail 或任何服務﹐設定就已經生效了﹗

呵呵~~~是否很開心呢﹖不過﹐您有沒有意識到一個問題﹕您使用的 intertnet 連線是固定的還是間斷的呢﹖如果您使用 modem 撥接的話﹐當您下線後﹐如何進行郵件交換呢﹖在預設情況下﹐如果 sendmail 收到郵件傳遞請求之後﹐會即時進行﹐如果因為其它原因(包括離線)而不能即時傳遞的話﹐會將郵件存列於 /var/spool/mqueue 目錄之下﹐然後每隔 1 小時(視乎設定)嘗試重遞﹐如果 4 小時之後還未能送出﹐會發出一封警告信給寄信者﹔如果5 天之後還在 queue 裡面﹐那麼這封信就會退回寄信者了。

假如別人也是用 sendmail 來寄信給您的 domain 的話﹐如果您的伺服器下線了﹐對方也會將信存在 queue 裡面。由此可見﹐使用 ppp 連線並不是理想的郵件傳遞方式。如果您不能建立一條固定的 internet 連線﹐那麼﹐將 DNS 和 Mail 都交由您的 ISP 保管好了。如果是這樣的話﹐您只要在 /etc/sendmail.cf 這個檔案裡面﹐找到這行(大約在 97 行的位置)﹐將之修改為﹕
DSmailserver.isp.net

(注意句子沒有空白鍵)。這樣的話﹐當您的伺服器在線的時候﹐那些不能即時傳遞而存在 queue 的郵件﹐或那些伺服器本身不知道如何傳遞的郵件(如那些非本地郵件)﹐就會第一時間傳給 ISP 的郵件伺服器﹐讓他們代理您的傳遞﹐而您呢﹖Sit back & relax!

設定 fetchmail

哈哈﹐別高興得太早啦~~~ 收信呢﹖﹖是哦~~~ 怎麼收﹖您大可叫您的 ISP 為每一個使用者建立信箱﹐然後讓他們通過 POP 去取信。但這樣的話﹐費用顯然會比較高﹐而且如果以後人員更換的話﹐還得勞煩上頭幫您修改。為何不這樣﹕只需在 ISP 建立一個帳號﹐然後所有的使用者都可以收信呢﹖

可以造到麼﹖

沒問題﹗

不過﹐除了 sendmail 之外﹐您還得使用另一個程式﹐叫做 fetchmail 的東東。不過﹐條件是 DNS 交由 ISP 管理﹐或從外面透過 DNS 查詢到的 MX 記錄指向 ISP 的伺服器﹔也就是說﹐他們會幫您代收所有傳給您 domain 的郵件﹔同時 ISP 還必須會將所有傳給您 domain 的郵件餵進那個單一信箱去。如果他們不會做﹐只要他們也使用 sendmail ﹐您教他們修改一個檔案﹕/etc/mail/virtusertable ﹐加入﹕
@your.domain.name	isp_account@isp.net

跟著執行﹕
makemap -r hash /etc/mail/virtusertable.db < /etc/mail/virtusertable

這裡假設他們在設定 sendmail 的時候已經定義出‘FEATURE(virtusertable)’這個功能。而且﹐使用的資料庫格式為‘hash’﹐如果他們使用 dbm 格式的話﹐將 hash 改成 dmb 就可以了。

然後﹐您自己還要修改/etc/sendmail.cf 這個檔案(大約在 91 、136、141 和 1032 行)﹕
......

Dj$w.your.domain.name

......

#CL root

#CE root

CM root

......

DMyour.domain.name

......

R$*                     $#error $@ 5.7.1 $: "550 Relaying denied"

......

(在修改 /etc/sendmail.cf 的時候務必注意﹕句子開頭帶空白鍵﹐或 Tab﹐或是沒有空白﹐效果都不一樣。以上所舉的句子都是直接用字母開頭的﹗)

修改好之後﹐重新啟動 sendmail :
/etc/rc.d/init.d/sendmail restart

接著﹐我們在 root 的家目錄 /etc/root 裡面﹐建立這樣一個檔案﹕.fetchmailrc (別少了前面的‘.’﹗) ﹕
set postmaster "postmaster"

poll mail.isp.net with proto POP3

  localdomains your.domain.name

       user "isp_account" there with password "hBg7-rE10" is * here options fetchall

如果您能進入 X Windows﹐可以執行 fetchmailconf 用 GUI 來設定這個檔案。因為在這個檔案裡面﹐包含了您的 ISP 帳號和密碼﹐為避免其它使用者看到﹐請執行﹕
chmod 0600 .fetchmailrc

這樣設定基本已經完成了﹐以 root 的身份執行fetchmail -d 300﹐這樣每隔 5 分鐘﹐fetchmail 就會幫您從 mail.isp.net 的 isp_account 帳號下載郵件﹐同時還會分發到各個使用者的本地郵箱中去。但您也可以使用定時器來設定 fetchmail 的執行動作。例如﹐執行﹕
crontab -e

然後加入這行﹕
0,20,40 * * * * /usr/bin/fetchmail -v

這樣系統每隔 20 分鐘就會幫您執行 fetchmail 了﹐當然﹐您的連線也要設定好啦。例如﹐您可以使用 Diald 來實現自動連線﹐不過﹐我這裡略過這部份的討論﹐因為我還沒實際設定過。如果您設定 diald 成功﹐可否將步驟寄來給我呢﹖或許有空我測試出來再和大家分享吧。

設定轉遞 (aliases)

如果您不善忘的話﹐我們在設定 httpd 、news、fetchmail 等服務的時候﹐都常會指定一個管理者的信箱名稱(也可以是地址)﹐例如﹕webmastet、postmaster 等等。您或許知道這些使用者其實並沒有出現在 /etc/passwd 中﹐那麼傳給他們的郵件又會寄哪裡去了呢﹖這個秘密﹐就是郵件伺服器的 alias 功能啦﹐也有人稱之為‘mail list’。說穿了其實只是一個檔案﹕/etc/aliases 。如果您用 vi 去開啟這個檔案﹐多看兩遍您就知道是怎麼回事了。

在 /etc/aliases 這個檔案中﹐您會發現沒有“#”註解的每一行﹐開始都是一個名稱﹐然後跟著一個“﹕”符號﹐然後在其右邊又有其它的名稱。其工作原理是﹕當 sendmail 收到一個本地郵件的時候﹐會檢查這個 /etc/aliase 檔案﹐如果發現“﹕”左邊的名字跟接收者名稱吻合﹐就會將郵件轉遞給“﹕”右邊的名稱。在右邊的名稱﹐可以多過一個﹔也可以是另一個郵件地址﹔也可以指向一個檔案或程式。當郵件轉給右邊之後﹐又重新找一遍這個 /etc/alias 裡面的設定﹐直到再找不到左邊名稱為止。例如下面這個例子﹕
MAILER-DAEMON:  postmaster

postmaster:     root

daemon:         root

root:          netman, kenny

kenny: "| sendmail kenny@other.mail.net"

sales:	sales-list

sales-list: ":include:/etc/sales.list"

這樣﹐凡是傳給 MAILER-DAEMON 的就會轉給 postmaster ﹐然後再轉給 root﹐另外 daemon 也會轉給 root﹐而 root 呢﹐又分別轉給 netman 和 kenny﹐最後 natman 再也找不到名稱了﹐直接送到 netman 的信箱去﹔而 kenny 呢﹖則通過 sendmail 轉到 kenny@other.mail.net 那個地址去。另外﹐我們只需建立一個 /etc/sales.list 這樣的檔案﹐在裡面寫上所有 sales 的名稱﹐可以全部為一行﹐用‘﹐’和一個空白鍵分隔﹔這樣﹐所有 salse 都會收到寄給 sales 的郵件了。

不過﹐剛才稍微騙了您一下﹐sendmail 真正讀取的並不是 /etc/aliases 這個檔案﹐而是另一個經過資料庫格式過的檔案﹐我們無需知道它叫什麼﹐只要您滿意您的 /etc/aliases 檔案之後﹐馬上執行﹕
newaliases
注意一下有沒有錯誤信息﹐有則重複修改檔案和執行 newaliases ﹐直到再沒錯誤為止。

進一步修改

到此為止﹐您的 sendmail 已經足以應付日常需要了﹐但有時候您還可能進行額外的設定﹐以符合實際的需求。如果您懂得直接修改 sendmail 的設定檔的話﹐您可以直接修改﹐例如 /etc/sendmail.* ﹐而 /etc/mail/* 的檔案呢﹐您會發現它們大多數都是配對的﹐每個檔案都會對著一個 *.db 的檔案。您可對那些沒有 .db 的檔案修改﹐然後執行﹕
makemap -r hash /etc/mail/file.db < /etc/mail/file

就可以將之編譯成指定的數據庫格式了(通常會是 hash 或 dmb 兩種)﹐因為 sendmail 只會去讀取經過格式化的數據庫啦。例如﹐sendmail 在預設情況下是將 RELAY 功能關閉了﹐也就是說﹐除非指定的主機(或 domain)﹐別的郵件伺服器是不能通過您的 sendmail 傳遞郵件的。如果您要開放 RELAY 給某些主機(或 domain)﹐您可以先修改 /etc/mail/access 這個檔案:
debian		RELAY

debian.home	RELAY

home		RELAY

192.168.1	RELAY

然後執行下列命令就可以了﹕
makemap -r hash /etc/mail/access.db < /etc/mail/access

但還有一個更簡單的方法﹐就是確定 /etc/sendmail.cf 檔案有這樣一行(大約在 123 行附近吧)﹕
FR-o /etc/mail/relay-domains 

然後建立起 /etc/mail/relay-domains 這個檔案﹐將所有要 relay 的機器(或 domain ) 寫進這個檔案﹐每個名稱佔一行﹐這樣就可以了。

其實﹐來來去去這些設定﹐無非都在 /etc/sendmail.cf 這個檔案中﹐但要修改這個一千多行的檔案可不容易哦﹐搞不好您的 sendmail 就不工作了呢。如果您要手工修改它﹐一定要備份一個 copy 哦~~~。

那麼﹐有沒有容易些的設定呢﹖有的﹐就是使用 M4 啦。不過﹐我不打算詳細教您怎樣用 M4 來設定 sendmail.cf ﹐但您可以從下面的案例中看看如何使用 M4 這個程式。

設Mail Proxy

我們都知道﹐如果使用郵件伺服器﹐最好有自註冊了的 domain ﹐否則充其量只能用在內部網路之上。難道這是縮命麼﹖非也﹗在下面的案例中﹐我主要參考 http://www.linuxgazette.com/issue42/stumpel.html 這篇文章﹐成功讓沒有註冊的 domain 使用者分享一個 ISP 郵件信箱。準確來說﹐還不是 100% 成功啦。例如﹐我暫時不能使用同一台主機同時負責 SMTP 和 POP 的服務﹐同時﹐還得裝一台 Debian 2.1機器(請參考﹕http://www.linpus.com.tw/manual/debian2.1/index.htm 進行安裝)﹐在 Debian 上不能跑 sendmail﹐而是用 Exim 代替﹔最缺陷的是﹐在回郵地址中﹐必須使用‘ user<isp_account@isp.net>’的格式﹐缺一不可。

如果您對這樣的一個系統有興趣﹐可以繼續往下看﹐也歡迎共同研究研究。

1﹐首先﹐修改您的 /etc/sendmail.mc
divert(-1)

dnl This is the macro config file used to generate the /etc/sendmail.cf

dnl file. If you modify thei file you will have to regenerate the

dnl /etc/sendmail.cf by running this macro config through the m4

dnl preprocessor:

dnl

dnl        m4 /etc/sendmail.mc > /etc/sendmail/cf

dnl

dnl You will need to have the sendmail-cf package installed for this to

dnl work.

include(`/usr/lib/sendmail-cf/m4/cf.m4')

define(`confDEF_USER_ID',``8:12'')

OSTYPE(`linux')

define(`ALIAS_FILE',`/etc/aliases')

undefine(`UUCP_RELAY')

undefine(`BITNET_RELAY')

define(`confAUTO_REBUILD')

define(`confTO_CONNECT', `1m')

define(`confTRY_NULL_MX_LIST',true)

define(`confDONT_PROBE_INTERFACES',true)

define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')

FEATURE(masquerade_envelope)

FEATURE(genericstable, `hash -o /etc/mail/genericstable')

GENERICS_DOMAIN_FILE(`/etc/mail/genericsdomain')

define(`SMART_HOST',`mail.isp.net')

FEATURE(`smrsh',`/usr/sbin/smrsh')

FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable')

FEATURE(redirect)

dnl FEATURE(always_add_domain)

FEATURE(use_cw_file)

FEATURE(local_procmail)

MAILER(procmail)

MAILER(local)

MAILER(smtp)

FEATURE(`access_db')

FEATURE(`blacklist_recipients')

dnl We strongly recommend to comment this one out if you want to protect

dnl yourself from spam. However, the laptop and users on computers that do

dnl not hav 24x7 DNS do need this.

dnl FEATURE(`accept_unresolvable_domains')

dnl FEATURE(`relay_based_on_MX')

注意﹕請將 SMART_HOST 改成您自己的 ISP 郵件主機。

2﹐然後備份好 /etc/sendmail.cf 再執行 m4﹕
cp /etc/sendmail.cf /etc/sendmail.cf.orig
m4 /etc/sendmail.mc > /etc/sendmail.cf

3﹐將您的郵件主機名稱和本地 domain 名稱 加進 /etc/mail/genericsdomain裡面去(一個名稱一行)。

4﹐ 設定好使用者的郵件地址轉換﹐請修改/etc/mail/genericstable﹐其內容類似如下(請參照自己的實際情形修改)﹕
netman        isp_account@isp.net

kenny         isp_account@isp.net

user1         isp_account@isp.net

其中﹕左邊為本地使用者﹐右邊為 ISP 的郵件帳號地址。

5﹐產生genericstable.db﹐請執行﹕
makemap -r hash /etc/mail/genericstable.db < /etc/mail/genericstable
/etc/rc.d/init.d/sendmail restart

6﹐然後轉到在 Debian 2.1 機器上面﹐進入 X Windows 裡面執行 fetchmailconf 來設定﹐或直接修改 .fetchmailrc 檔案(在執行下載任務之使用 者家目錄之下) ﹐其內容類似如下﹕
# Configuration created Mon Sep 27 00:37:13 1999 by fetchmailconf

set postmaster "postmaster"

poll mail.isp.net with proto POP3

       user "isp_account" there with password "hBg7-rE10" is netman here 

options fetchall warnings 3600

(注意﹐這個檔案比前面的例子略有不同。)

7﹐在 netman (或是在 fetchmailrc 指定的本地接收者) 的家目錄裡面修改 .forward 檔案﹐讓其內容類似如下﹕
#Exim filter

if $header_to: contans netman then deliver netman endif

if $header_to: contans kent then deliver kent endif

if $header_to: contans usr1 then deliver user1 endif

(注意﹕如果使用 sendmail 來執行本地郵件的話則會出現錯誤。)

設定基本如此﹐您只需在 MUA 那端將 SMTP 指向 Redhat 機器﹐而將 POP 指向 Debian 機器就可以了﹐且 ‘Identity’那裡一定要輸入使用者名稱(和本地郵件帳號名稱一至) 。通過 Redhat 傳出去的信件都會自動將回郵地址改成 user<isp_account@isp.net> 的地址﹐所以對方只要按 Repply 就可以了。但是如果對方要新撰寫郵件給您的本地用戶﹐必須也要依照上述格式才可。否則所有郵件都只能下載到 fetchmail 指定的使用者那裡﹐而不會再分發出去了。

測試

如果您在測試過程中遇到困難﹐可以先查一查 /var/log/maillog 這個檔案﹐看看 server 傳遞是否完成(denied 或 accepted)﹐由此判斷出問題的原因﹕

  • 如果您在寄信的時候會遇到 Relay denied 的問題﹐這可能是您的 MUA 所在的機器(或網域)不在 /etc/mail/access 或 /etc/mail/relay-domains 檔案裡面。(也可以參考下一提示內容)
  • 如果您碰到“sender domain must exist”或“cannot route to sender” 的問題﹐那么要確定在 MUA 所填寫的 Repply Address 是一個合法地址﹐或是能夠被對方 route back 得到的。
  • 如果可以寄信卻不能收信﹐那麼檢查一下 /etc/inetd.conf 裡面的 POP 和 IMAP 是否打開了。
  • 另外﹐和 sendmail 最緊密合作的莫過於 DNS 了﹐您一定要確定您的 DNS 要設定正確(完全正確﹗)。例如﹕如果您遇到 MX loop back 的問題﹐那麼可能是您忘了給 mail server 主機設定一個指向自己的 MX 記錄了。
  • 如果您設定好 sendmail.cw 但仍然不能用 domain.name 收信﹐那麼請檢查 DNS 有沒有為 domain 指定 MX﹔同時也可以試試為 domain 自己指定一個 A 記錄﹐如﹕
    @ IN MX 10 mail.server.domain.name.
    @ IN A 192.168.0.1
  • 如果您在啟動 sendmail 的時候會延遲很久﹐那麼請確定 /etc/hosts、/etc/HOSTNAME、 和 DNS 關於這台機器的名稱設定正確。同時﹐手工輸入
    hostname your.mail.server.name
    也可以(暫時)解決問題。
  • 還有﹐如果您使用 fetchmail 來下載郵件﹐要確定 .fetchmailrc 的執行權限﹐還有雙方的使用者(及密碼)要指定正確﹐以及各使用者的信箱要被建立好。
  • 有時候﹐使用前面教的 telnet 方式連接﹐也有助於我們發現問題所在。
  • 再有其它問題的話﹐還是到 BBS 或 NEWS 板問問吧﹐但問之前先把資料整理出來﹐越詳細越好。
善用 sendmail ﹐您可以做到許多意想不到的事情哦~~~﹐您自己慢慢發掘吧﹗